﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using System.Collections.ObjectModel;
using System.Data;
using System.Globalization;
using produccion.reportes;

namespace produccion.forms
{
    /// <summary>
    /// Lógica de interacción para FRMinfGenMat.xaml
    /// </summary>
    public partial class FRMinfGenMat : Window
    {
        String StrConsulta;
        public FRMinfGenMat()
        {
            InitializeComponent();
        }

        private void butPro_Click(object sender, RoutedEventArgs e)
        {
            infGenMat.Instance.consInfGenMat();
        }

        private void butImp_Click(object sender, RoutedEventArgs e)
        {
            infGenMat.Instance.imprimir();
        }

        private void butSal_Click(object sender, RoutedEventArgs e)
        {
            this.Close();
        }

        private void Window_Closed(object sender, EventArgs e)
        {
            infGenMat.Instance = null;
        }

        private void chkHabilitar_Click(object sender, RoutedEventArgs e)
        {
            if (chkHabilitar.IsChecked == true)
            {
                datInf.Visibility = Visibility.Visible;
                datInf2.Visibility = Visibility.Collapsed;
            }
            else
            {
                datInf.Visibility = Visibility.Collapsed;
                datInf2.Visibility = Visibility.Visible;
            }
        }

        private void datGrupos_PreviewKeyDown(object sender, KeyEventArgs e)
        {
            var elemento = e.OriginalSource as UIElement;
            if (e.Key == Key.Enter && elemento != null)
            {
                e.Handled = true;
                elemento.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
            }
        }

        private void datInf2_PreviewKeyDown(object sender, KeyEventArgs e)
        {
            var elemento = e.OriginalSource as UIElement;
            if (e.Key == Key.Enter && elemento != null)
            {
                e.Handled = true;
                elemento.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
            }
        }

        //
        // SINGLE CLICK EDITING
        //
        private void DataGridCell_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            DataGridCell cell = sender as DataGridCell;
            if (cell != null && !cell.IsEditing && !cell.IsReadOnly)
            {
                if (!cell.IsFocused)
                {
                    cell.Focus();
                }
                DataGrid dataGrid = FindVisualParent<DataGrid>(cell);
                if (dataGrid != null)
                {
                    if (dataGrid.SelectionUnit != DataGridSelectionUnit.FullRow)
                    {
                        if (!cell.IsSelected)
                            cell.IsSelected = true;
                    }
                    else
                    {
                        DataGridRow row = FindVisualParent<DataGridRow>(cell);
                        if (row != null && !row.IsSelected)
                        {
                            row.IsSelected = true;
                        }
                    }
                }
            }
        }

        static T FindVisualParent<T>(UIElement element) where T : UIElement
        {
            UIElement parent = element;
            while (parent != null)
            {
                T correctlyTyped = parent as T;
                if (correctlyTyped != null)
                {
                    return correctlyTyped;
                }

                parent = VisualTreeHelper.GetParent(parent) as UIElement;
            }
            return null;
        }

        private void Window_KeyDown(object sender, KeyEventArgs e)
        {
            var elemento = e.OriginalSource as UIElement;
            if (e.Key == Key.F3 && elemento != null)
            {
                if (MDOgeneral.logBusquedadAbierta == true) { MDOgeneral.logBusquedadAbierta = false; }
            }

            if (e.Key == Key.F4 && elemento != null)
            {
                if (MDOgeneral.logBusquedadAbierta1 == true) { MDOgeneral.logBusquedadAbierta1 = false; }
            }

            if (e.Key == Key.F5 && elemento != null)
            {
                if (MDOgeneral.logBusquedadAbierta2 == true) { MDOgeneral.logBusquedadAbierta2 = false; }
            }
        }

        private void BtnAyudaExportarExcel_Click(object sender, RoutedEventArgs e)
        {
            FrmAyudasGenericas FrmAyudas = new FrmAyudasGenericas();//FJRF - Creamos una variable que maneje las propiedades del formulario que vamos a invocar
            FrmAyudas.pStrTituloVentana_Opcional = "INFORME GENERAL DE MATERIALES";//FJRF - Le enviamos un titulo personalizado al formulario

            StrConsulta = "SELECT UPPER(NOMGRP_TMP) AS GRUPO,  UPPER(NOMSUB_TMP) AS SUBGRUPO,  UPPER(CODMAT_TMP || CODCOL_TMP) AS CODMAT,  UPPER(NOMMAT_TMP) AS MATERIAL,  UPPER(NOMCOL_TMP) AS COLOR,  UPPER(NOMUNI_TMP) AS UNIDAD,  CANMAT_TMP AS EXISTENCIA,  COSUNI_TMP AS COSTO,  COSTOT_TMP AS COSTOTOTAL ";//FJRF - Armamos la consulta
            StrConsulta = StrConsulta + "FROM TMPINFGENMAT ";//FJRF - Armamos la consulta
            StrConsulta = StrConsulta + "ORDER BY NOMGRP_TMP, NOMSUB_TMP, NOMMAT_TMP ";//FJRF - Armamos la consulta

            FrmAyudas.pStrConsultaSql_Obligatorio = StrConsulta;//FJRF - Armamos la consulta
            FrmAyudas.pStrCampoCodigoDeLaTabla_Obligatorio = "CODMAT";//FJRF - Le decimos que este es el campo codigo o llave debe tener el nombre final osea el alias si es q lo tiene
            FrmAyudas.pStrBuscarPorDefectoEnElCampo_Opcional = "MATERIAL";//FJRF - Asignamos el dato a buscar
            FrmAyudas.pBooQuitarBotonRetornar_Opcional = true;//FJRF - Quitamos el boton de retornar datos
            FrmAyudas.pBooPonerBotonExportarExcel_Opcional = true;//FJRF - Activamos el boton para que se le permita la exportacion de datos a excel

            String StrColumnasParaFormato = "EXISTENCIA, COSTO, COSTOTOTAL ";//FJRF - Columnas para formato numerico
            FrmAyudas.pStrNombreColumnasParaFormatoNumericoSeparadoPorComas_Opcional = StrColumnasParaFormato;//FJRF - Enviamos las columnas que se le van a hacer formato numerico

            FrmAyudas.ShowDialog();//FJRF - Invocamos el formulario
        } 
    }


    public class infGenMat : ObservableObject
    {

        #region singleton
        
        private static infGenMat instance = null;
        
        protected infGenMat() {
            consGrupo();
            consAnos();
            consMes();
            logTodos = true;
            MDOgeneral.conectar();
            strTituloVentana = "Informe general de materiales - Usuario: " + MDOgeneral.usuario + " - [FRMinfGenMat]";
        }
        
        public static infGenMat Instance
        {
            get
            {
                if (instance == null)
                    instance = new infGenMat();
                return instance;
            }
            set { 
                if (instance != null)
                    instance = null;
            }
        }
        
        #endregion

        private string _strTituloVentana;
        public string strTituloVentana
        {
            get { return _strTituloVentana; }
            set { _strTituloVentana = value; RaisePropertyChangedEvent("strTituloVentana"); }
        }

        private ObservableCollection<grupo> _grupos = new ObservableCollection<grupo>();
        public ObservableCollection<grupo> grupos
        {
            get { return _grupos; }
            set { _grupos = value; RaisePropertyChangedEvent("grupos"); }
        }
        public class grupo:ObservableObject
        {
            private Boolean _estaSel=true;
            public Boolean estaSel 
            {
                get { return _estaSel; }
                set { _estaSel = value; RaisePropertyChangedEvent("estaSel"); }
            }

            private string _codgru;
            public string codgru 
            {
                get { return _codgru; }
                set { _codgru = value; RaisePropertyChangedEvent("codgru"); }
            }

            private string _nomgru;
            public string nomgru 
            {
                get { return _nomgru; }
                set { _nomgru = value; RaisePropertyChangedEvent("nomgru"); }
            }
        }

        private Boolean _logTodos = true;
        public Boolean logTodos
        {
            get { return _logTodos; }
            set
            {
                _logTodos = value;
                if (_logTodos)
                {
                    selTodoslosGrupos();
                }
                else
                {
                    selNingunGrupo();
                }
                RaisePropertyChangedEvent("logTodos");
            }
        }

        private Boolean _logMotrarCeros= false;
        public Boolean logMostrarCeros
        {
            get { return _logMotrarCeros; }
            set { _logMotrarCeros = value; RaisePropertyChangedEvent("logMostrarCeros"); }
        }

        private void selTodoslosGrupos()
        {
            foreach (grupo grp in grupos)
            {
                grp.estaSel = true;
            }
        }

        private void selNingunGrupo()
        {
            foreach (grupo grp in grupos)
            {
                grp.estaSel = false;
            }
        }

        public void consGrupo() 
        {
            try 
            {
                clases.CLSMAEGRP maegru = new clases.CLSMAEGRP();
                List<clases.CLSMAEGRP> grs=   maegru.listaGrupos();
                foreach (clases.CLSMAEGRP r in grs) 
                {
                    grupo a = new grupo {codgru=r.CODGRP_GRP,nomgru=r.NOMGRP_GRP};
                    grupos.Add(a);
                }
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        string selgrupos;
        public void ConSelgrupos() 
        {
            try 
            {
                selgrupos="";
                foreach(grupo r in grupos)
                {
                    if (r.estaSel) {
                        if (String.IsNullOrEmpty(selgrupos))
                        {
                            selgrupos = r.codgru;
                        }
                        else 
                        {
                            selgrupos = selgrupos + "-" + r.codgru;
                        }
                    }
                }
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }


        private ObservableCollection<ano> _anos = new ObservableCollection<ano>();
        public ObservableCollection<ano> anos
        {
            get { return _anos; }
            set { _anos = value; RaisePropertyChangedEvent("anos"); }
        }

        public class ano : ObservableObject
        {
            private string _codano;
            public string codano 
            {
                get { return _codano;}
                set { _codano = value; RaisePropertyChangedEvent("codano"); }
            }
        }

        private ObservableCollection<mes> _meses= new ObservableCollection<mes>();
        public ObservableCollection<mes> meses
        {
            get { return _meses; }
            set { _meses = value; RaisePropertyChangedEvent("meses"); }
        }

        public class mes : ObservableObject
        {
            private string _codmes;
            public string codmes
            {
                get { return _codmes; }
                set {   _codmes = value; RaisePropertyChangedEvent("codmes"); }
            }

            private string _nommes;
            public string nommes
            {
                get { return _nommes; }
                set { _nommes = value; RaisePropertyChangedEvent("nommes"); }
            }
        }

        public void consAnos() 
        {
            try 
            {
                for (int y = 2000; y <= DateTime.Now.Year; y++)
                {
                    anos.Add(new ano { codano = y.ToString() });
                }
                selano = anos.Last();
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        public void consMes()
        {
            try
            {
                meses.Clear();
                if (selano.codano.Equals(DateTime.Now.Year.ToString()))
                {
                    meses.Add(new mes { codmes = "00", nommes = "Actual" });
                    for (int j = 1; j <= DateTime.Now.Month-1; j++)
                    {
                        DateTimeFormatInfo dtinfo = new CultureInfo("es-ES", false).DateTimeFormat;
                        meses.Add(new mes { codmes = j < 10 ? "0" + j.ToString() : j.ToString(), nommes = dtinfo.GetMonthName(j) });
                    }
                }
                else 
                {
                    meses.Add(new mes { codmes = "00", nommes = "Actual" });
                    meses.Add(new mes { codmes = "01",nommes="enero" });
                    meses.Add(new mes { codmes = "02",nommes="febrero" });
                    meses.Add(new mes { codmes = "03",nommes="marzo" });
                    meses.Add(new mes { codmes = "04",nommes="abril" });
                    meses.Add(new mes { codmes = "05",nommes="mayo" });
                    meses.Add(new mes { codmes = "06",nommes="junio" });
                    meses.Add(new mes { codmes = "07",nommes="julio" });
                    meses.Add(new mes { codmes = "08",nommes="agosto" });
                    meses.Add(new mes { codmes = "09",nommes="septiembre" });
                    meses.Add(new mes { codmes = "10",nommes="octubre" });
                    meses.Add(new mes { codmes = "11",nommes="noviembre" });
                    meses.Add(new mes { codmes = "12",nommes="diciembre" });
                }
                selmes = meses[0];
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        private ano _selano;
        public ano selano 
        {
            get { return _selano; }
            set 
            { 
                _selano = value;
                consMes();
                RaisePropertyChangedEvent("selano");
            }
        }

        private mes _selmes;
        public mes selmes
        {
            get { return _selmes; }
            set { _selmes = value; RaisePropertyChangedEvent("selmes"); }
        }

        private string _txtpie;
        public string txtpie 
        {
            get { return _txtpie; }
            set { _txtpie = value; RaisePropertyChangedEvent("txtpie"); }
        }

        private DataTable _infMatGen=new DataTable();
        public DataTable infMatGen 
        {
            get { return _infMatGen; }
            set { _infMatGen = value; RaisePropertyChangedEvent("infMatGen"); }
        }

        public void consInfGenMat() 
        {
            try 
            {
                Mouse.OverrideCursor = Cursors.Wait;

                ConSelgrupos();
                clases.CLSMAEMAT mae = new clases.CLSMAEMAT();
                mae.RepGenMat(selano.codano,selmes.codmes,selgrupos, logMostrarCeros==false ? "N" : "S");
                infMatGen=mae.repGenMat;
                infMatGen.TableName = "TMPINFGENMAT";

                Mouse.OverrideCursor = Cursors.Arrow;
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        public void imprimir() 
        {
            try 
            {
                DataSet ds = new DataSet("dsInfGenMat");
                ds.Tables.Add(infMatGen.Copy());
                DataTable PIE = new DataTable("PIE");
                PIE.Columns.Add("DESCRIPCCION");
                PIE.Columns.Add("ANO");
                PIE.Columns.Add("MES");
                PIE.Columns.Add("STREMPRESA");
                DataRow r = PIE.NewRow();
                r["ANO"] = selano.codano;
                r["MES"] = selmes.nommes;
                r["DESCRIPCCION"] = txtpie;
                r["STREMPRESA"] = MDOgeneral.strEmpresaImprime;
                PIE.Rows.Add(r);
                ds.Tables.Add(PIE);
                Vista vista = new Vista { ds = ds, reporte = @"reportes\repInfGenMat.rpt" };
                vista.Show();      
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }
    }

}
